/**
  @file     	DESIGNPATTERN_Director.h 
  @brief    	1.When the algorithm to create complex object should be independent of the part of the object, 
                  as well as their assembly;
				2.When construction process must be allowed to construct the object is different;
  @author  	arvin
  @version 	1.0   2012/12/20
 */

#ifndef CXX_DESIGNPATTERN_DIRECTOR_H
#define CXX_DESIGNPATTERN_DIRECTOR_H
#include "ProductDef.h"

class AbstractComputer;
class Builder;

class Director
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~Director();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer() = 0;

	/**
	* GetComputer
	*
	* @param VOID
	* @return COMPUTER_TYPE
	*/
	COMPUTER_TYPE GetComputer();
protected:
	/**
	* Construction
	*
	* @param COMPUTER_TYPE eComputer
	* @return
	*/
	Director(COMPUTER_TYPE eComputer);

	/**
	* SetComputer
	*
	* @param COMPUTER_TYPE eComputer
	* @return
	*/
	VOID SetComputer(COMPUTER_TYPE eComputer);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	Director();

	/**
	* Copy Construction
	*
	* @param const Director& cDirector
	* @return
	*/
	Director(const Director& cDirector);

public:
protected:
private:
	COMPUTER_TYPE m_eComputer;
};

class NotebookDirector : public Director
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~NotebookDirector();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer() = 0;

	/**
	* GetComputerPart
	*
	* @param VOID
	* @return COMPUTERPART_TYPE
	*/
	COMPUTERPART_TYPE GetComputerPart();
protected:
	/**
	* Construction
	*
	* @param COMPUTERPART_TYPE eComputerPart
	* @return
	*/
	NotebookDirector(COMPUTERPART_TYPE eComputerPart);

	/**
	* SetComputerPart
	*
	* @param COMPUTERPART_TYPE eComputerPart
	* @return
	*/
	VOID SetComputerPart(COMPUTERPART_TYPE eComputerPart);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	NotebookDirector();

	/**
	* Copy Construction
	*
	* @param const NotebookDirector& cNotebookDirector
	* @return
	*/
	NotebookDirector(const NotebookDirector& cNotebookDirector);

public:
protected:
private:
	COMPUTERPART_TYPE m_eComputerPart;
};

class DesktopDirector : public Director
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~DesktopDirector();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer() = 0;

	/**
	* GetComputerPart
	*
	* @param VOID
	* @return COMPUTERPART_TYPE
	*/
	COMPUTERPART_TYPE GetComputerPart();
protected:
	/**
	* Construction
	*
	* @param COMPUTERPART_TYPE eComputerPart
	* @return
	*/
	DesktopDirector(COMPUTERPART_TYPE eComputerPart);

	/**
	* SetComputerPart
	*
	* @param COMPUTERPART_TYPE eComputerPart
	* @return
	*/
	VOID SetComputerPart(COMPUTERPART_TYPE eComputerPart);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	DesktopDirector();

	/**
	* Copy Construction
	*
	* @param const DesktopDirector& cDesktopDirector
	* @return
	*/
	DesktopDirector(const DesktopDirector& cDesktopDirector);

public:
protected:
private:
	COMPUTERPART_TYPE m_eComputerPart;
};

class ServerDirector : public Director
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~ServerDirector();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer() = 0;

	/**
	* GetComputerPart
	*
	* @param VOID
	* @return COMPUTERPART_TYPE
	*/
	COMPUTERPART_TYPE GetComputerPart();
protected:
	/**
	* Construction
	*
	* @param COMPUTERPART_TYPE eComputerPart
	* @return
	*/
	ServerDirector(COMPUTERPART_TYPE eComputerPart);

	/**
	* SetComputerPart
	*
	* @param COMPUTERPART_TYPE eComputerPart
	* @return
	*/
	VOID SetComputerPart(COMPUTERPART_TYPE eComputerPart);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	ServerDirector();

	/**
	* Copy Construction
	*
	* @param const ServerDirector& cServerDirector
	* @return
	*/
	ServerDirector(const ServerDirector& cServerDirector);

public:
protected:
private:
	COMPUTERPART_TYPE m_eComputerPart;
};

class NotebookDirectorNormal : public NotebookDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorNormal(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~NotebookDirectorNormal();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorNormal();

	/**
	* Copy Construction
	*
	* @param const NotebookDirectorNormal& cNotebookDirectorNormal
	* @return
	*/
	NotebookDirectorNormal(const NotebookDirectorNormal& cNotebookDirectorNormal);

public:
protected:
private:
	Builder* m_pBuilder;
};

class NotebookDirectorDoubleMouse : public NotebookDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorDoubleMouse(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~NotebookDirectorDoubleMouse();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorDoubleMouse();

	/**
	* Copy Construction
	*
	* @param const NotebookDirectorDoubleMouse& cNotebookDirectorDoubleMouse
	* @return
	*/
	NotebookDirectorDoubleMouse(const NotebookDirectorDoubleMouse& cNotebookDirectorDoubleMouse);

public:
protected:
private:
	Builder* m_pBuilder;
};

class NotebookDirectorDoubleKeyboard : public NotebookDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorDoubleKeyboard(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~NotebookDirectorDoubleKeyboard();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorDoubleKeyboard();

	/**
	* Copy Construction
	*
	* @param const NotebookDirectorDoubleKeyboard& cNotebookDirectorDoubleKeyboard
	* @return
	*/
	NotebookDirectorDoubleKeyboard(const NotebookDirectorDoubleKeyboard& cNotebookDirectorDoubleKeyboard);

public:
protected:
private:
	Builder* m_pBuilder;
};

class NotebookDirectorDoubleMonitor : public NotebookDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorDoubleMonitor(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~NotebookDirectorDoubleMonitor();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	NotebookDirectorDoubleMonitor();

	/**
	* Copy Construction
	*
	* @param const NotebookDirectorDoubleMonitor& cNotebookDirectorDoubleMonitor
	* @return
	*/
	NotebookDirectorDoubleMonitor(const NotebookDirectorDoubleMonitor& cNotebookDirectorDoubleMonitor);

public:
protected:
private:
	Builder* m_pBuilder;
};

class DesktopDirectorNormal : public DesktopDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorNormal(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~DesktopDirectorNormal();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorNormal();

	/**
	* Copy Construction
	*
	* @param const DesktopDirectorNormal& cDesktopDirectorNormal
	* @return
	*/
	DesktopDirectorNormal(const DesktopDirectorNormal& cDesktopDirectorNormal);

public:
protected:
private:
	Builder* m_pBuilder;
};

class DesktopDirectorDoubleMouse : public DesktopDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorDoubleMouse(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~DesktopDirectorDoubleMouse();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorDoubleMouse();

	/**
	* Copy Construction
	*
	* @param const DesktopDirectorDoubleMouse& cDesktopDirectorDoubleMouse
	* @return
	*/
	DesktopDirectorDoubleMouse(const DesktopDirectorDoubleMouse& cDesktopDirectorDoubleMouse);

public:
protected:
private:
	Builder* m_pBuilder;
};

class DesktopDirectorDoubleKeyboard : public DesktopDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorDoubleKeyboard(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~DesktopDirectorDoubleKeyboard();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorDoubleKeyboard();

	/**
	* Copy Construction
	*
	* @param const DesktopDirectorDoubleKeyboard& cDesktopDirectorDoubleKeyboard
	* @return
	*/
	DesktopDirectorDoubleKeyboard(const DesktopDirectorDoubleKeyboard& cDesktopDirectorDoubleKeyboard);

public:
protected:
private:
	Builder* m_pBuilder;
};

class DesktopDirectorDoubleMonitor : public DesktopDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorDoubleMonitor(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~DesktopDirectorDoubleMonitor();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	DesktopDirectorDoubleMonitor();

	/**
	* Copy Construction
	*
	* @param const DesktopDirectorDoubleMonitor& cDesktopDirectorDoubleMonitor
	* @return
	*/
	DesktopDirectorDoubleMonitor(const DesktopDirectorDoubleMonitor& cDesktopDirectorDoubleMonitor);

public:
protected:
private:
	Builder* m_pBuilder;
};

class ServerDirectorNormal : public ServerDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorNormal(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~ServerDirectorNormal();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorNormal();

	/**
	* Copy Construction
	*
	* @param const ServerDirectorNormal& cServerDirectorNormal
	* @return
	*/
	ServerDirectorNormal(const ServerDirectorNormal& cServerDirectorNormal);

public:
protected:
private:
	Builder* m_pBuilder;
};

class ServerDirectorDoubleMouse : public ServerDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorDoubleMouse(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~ServerDirectorDoubleMouse();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorDoubleMouse();

	/**
	* Copy Construction
	*
	* @param const ServerDirectorDoubleMouse& cServerDirectorDoubleMouse
	* @return
	*/
	ServerDirectorDoubleMouse(const ServerDirectorDoubleMouse& cServerDirectorDoubleMouse);

public:
protected:
private:
	Builder* m_pBuilder;
};

class ServerDirectorDoubleKeyboard : public ServerDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorDoubleKeyboard(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~ServerDirectorDoubleKeyboard();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorDoubleKeyboard();

	/**
	* Copy Construction
	*
	* @param const ServerDirectorDoubleKeyboard& cServerDirectorDoubleKeyboard
	* @return
	*/
	ServerDirectorDoubleKeyboard(const ServerDirectorDoubleKeyboard& cServerDirectorDoubleKeyboard);

public:
protected:
private:
	Builder* m_pBuilder;
};

class ServerDirectorDoubleMonitor : public ServerDirector
{
public:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorDoubleMonitor(Builder* pBuilder);

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	~ServerDirectorDoubleMonitor();

	/**
	* Create Computer
	*
	* @param VOID
	* @return AbstractComputer*
	* @note
	*/
	virtual AbstractComputer* CreateAbstractComputer();

protected:
private:
	/**
	* Construction
	*
	* @param Builder* pBuilder
	* @return
	*/
	ServerDirectorDoubleMonitor();

	/**
	* Copy Construction
	*
	* @param const ServerDirectorDoubleMonitor& cServerDirectorDoubleMonitor
	* @return
	*/
	ServerDirectorDoubleMonitor(const ServerDirectorDoubleMonitor& cServerDirectorDoubleMonitor);

public:
protected:
private:
	Builder* m_pBuilder;
};
#endif	/* >>CXX_DESIGNPATTERN_DIRECTOR_H<< */
/* EOF */